package com.download.manager.utils;

import android.content.Context;
import android.widget.TextView;
import android.widget.Toast;

import com.download.manager.M3u8DownLoadManager;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class M3u8FileUtil {

    //格式化
    private static DecimalFormat decimalFormat=new DecimalFormat("0.00");

    /**
     * 获取ts的路径
     * @param loadURL
     * @return
     */
    public static String getTsPath(String loadURL){
        if(loadURL.contains("/")) {
            return "/"+loadURL.substring(0,loadURL.lastIndexOf("/"));
        }else {
            return "";
        }
    }

    /**
     * 获取ts的名称
     * @param loadURL
     * @return
     */
    public static String getTsName(String loadURL){
        if(loadURL.contains("/")) {
            if (loadURL.contains("?")) {
                return loadURL.substring(loadURL.lastIndexOf("/") + 1, loadURL.indexOf("?"));
            }
            return loadURL.substring(loadURL.lastIndexOf("/") + 1, loadURL.length());
        }else {
            if (loadURL.contains("?")) {
                return loadURL.substring(0, loadURL.indexOf("?"));
            }
            return loadURL;
        }
    }

    /**
     * 获取m3u8的名称
     * @param url
     * @return
     */
    public static String getM3u8Name(String url){
        String m3u8;
        if(url.contains("?")){
            m3u8=url.substring(0,url.indexOf("?"));
        }else {
            m3u8=url;
        }
        String value="";
        if(m3u8.startsWith("http://")){
            value =m3u8.substring(7);
        }else if(m3u8.startsWith("https://")){
            value =m3u8.substring(8);
        }else {
            value =m3u8;
        }
        if(value.contains("/")) {
            return subName(value.substring(value.indexOf("/")));
        }else {
            return value;
        }
    }

    //去除开始的 /
    private static String subName(String name){
        if(name.startsWith("/")){
            return subName(name.substring(1));
        }
        return name;
    }

    public static void clearCache(Context context,boolean showToast){
        try{
            File file=new File(M3u8DownLoadManager.getInstance().SAVE_DIRS);
            if(file.exists()){
                deleteFile(file);
                if(showToast) {
                    Toast.makeText(context, "删除成功", Toast.LENGTH_SHORT).show();
                }
            }else {
                if(showToast) {
                    Toast.makeText(context, "文件不存在", Toast.LENGTH_SHORT).show();
                }
            }
        }catch (Exception e){
            if(showToast) {
                Toast.makeText(context, "删除失败！！", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 删除文件
     * @param file
     */
    public static void deleteFile(File file){
        if(file.isDirectory()){
            File[] listFiles=file.listFiles();
            for(File file1:listFiles){
                deleteFile(file1);
            }
        }
        file.delete();
    }

    public static String getCacheM3u8Size(String m3u8Url){
        return getCacheM3u8Size(M3u8DownLoadManager.getInstance().SAVE_DIRS,m3u8Url);
    }

    public static String getCacheM3u8Size(String parentFile,String m3u8Url){
        File file=getLocateSaveFile(parentFile, m3u8Url);
        if(file.exists()){
            return getFileSize(m3u8Url,file.getPath());
        }else {
            return "0B";
        }
    }

    public static File getLocateSaveFile(String parentFile,String m3u8Url){
        String m3u8name= getM3u8Name(m3u8Url);
        File file=new File(parentFile,m3u8name);
        File m3u8=new File(file.getPath()+"/"+m3u8name.substring(m3u8name.lastIndexOf("/")));
        return file;
    }

    public static String getLocateSavePlayFile(String parentFile,String m3u8Url){
        String m3u8name= getM3u8Name(m3u8Url);
        File file=new File(parentFile,m3u8name);
        File m3u8=new File(file.getPath()+"/"+m3u8name.substring(m3u8name.lastIndexOf("/")));
        return m3u8.getPath();
    }

    public static String getFileSize(String url,String path){
        String result=setCacheSize(null,path);
        return result;
    }

    public static String setCacheSize(TextView textView, String path){
        long s=getFileSize(new File(path));
        String size="";
        if(s<1024){
            size+=decimalFormat.format(s*1.0)+"B";
        }else if(s<1024*1024){
            size+=decimalFormat.format(s*1.0/1024)+"KB";
        }else if(s<1024*1024*1024){
            size+=decimalFormat.format(s*1.0/1024/1024)+"MB";
        }else {
            size+=decimalFormat.format(s*1.0/1024/1024/1204)+"GB";
        }
        if(textView!=null) {
            textView.setText(size);
        }
        return size;
    }

    public static long getFileSize(File file){
        if(!file.exists()){
            return 0;
        }
        long s=0;
        if(file.isDirectory()){
            File[] listFiles=file.listFiles();
            for(File file1:listFiles){
                s+=getFileSize(file1);
            }
        }else {
            s+=file.length();
        }
        return s;
    }

    public static boolean checkFileIntegrity(String parentFile,String m3u8Url) throws IOException {
        String m3u8name= getM3u8Name(m3u8Url);
        File file=new File(parentFile,m3u8name);
        if(!file.exists()){
            return false;
        }
//        getFileSize(m3u8Url,file.getPath());
        final File m3u8=new File(file.getPath()+"/"+m3u8name.substring(m3u8name.lastIndexOf("/")));
        if(m3u8.exists() && m3u8.length()>0){
            InputStream inputStream=new FileInputStream(m3u8);
            return checkTsList(m3u8,inputStream,m3u8Url.substring(0, m3u8Url.lastIndexOf("/") + 1));
        }else {
            return false;
        }
    }

    /**
     * 判断ts是否全部下载
     * 此处不再判断所有的ts文件名是否对应，仅校验ts文件个数是否一致
     * @param file
     * @param inputStream
     * @param httpTop
     * @return
     * @throws IOException
     */
    private static boolean checkTsList(File file,InputStream inputStream,String httpTop) throws IOException {
        List<String> m3u8List = new ArrayList<>();
        List<String> tsList = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = reader.readLine()) != null) {
            if (line.startsWith("#")) {

            } else if (line.length() > 0 && line.contains(".m3u8")) {
                m3u8List.add(httpTop+line);
            } else if (line.length() > 0 && line.contains(".ts")) {//判断该文件是否含有.ts文件
                tsList.add(line);
            }
        }
        inputStream.close();
        reader.close();
        if(m3u8List.size()>0){
            String url=m3u8List.get(0);
            if(m3u8List.size()>=2){
                url=m3u8List.get(1);
            }
            return checkFileIntegrity(M3u8DownLoadManager.getInstance().SAVE_DIRS,url);
        }else if(tsList.size()>0){
            File last=new File(file.getParent());
            int size=getFileNumber(last);
            if(size>=tsList.size()){
                return true;
            }else {
                return false;
            }
        }else {
            return false;
        }
    }

    /**
     * 获取文件加下的子文件ts个数
     * @param file
     * @return
     */
    private static int getFileNumber(File file){
        int number=0;
        if(file.exists()){
            if(file.isDirectory()){
                File[] tss=file.listFiles();
                for (File f:tss){
                    number+=getFileNumber(f);
                }
                return number;
            }else {
                if(file.getName().contains(".ts")) {
                    return 1;
                }else {
                    return 0;
                }
            }
        }else {
            return 0;
        }
    }

    /**
     * 删除指定连接的缓存文件
     * @param parentFile
     * @param m3u8Url
     */
    public static void deleteCacheFile(String parentFile,String m3u8Url){
        String m3u8name= getM3u8Name(m3u8Url);
        File file=new File(parentFile,m3u8name);
        if(file.exists()){
            deleteFile(file);
        }
    }

}
